In an effort to provide reliability, redundancy and improvement of aggregate bandwidth within a communications environment, multiple adapters are installed on the nodes of the environment. The adapters are used for interconnection of nodes, storage and communications networks. Each adapter on a node includes a plurality of adapter resource units (i.e., portions of adapter memory; a.k.a., ports) that are assignable to tasks executing on that node.
A task in a message-passing job is allocated with a fixed set of adapter resource units, identified by an adapter's id and its logical port number, to send and receive data. It is currently the design choice of the resource scheduler in the communications stack that the adapter resource units for each task be distributed across all available adapters on the node for data striping, reliability and optimization of aggregate bandwidth. However, in order to achieve optimal aggregate bandwidth for all tasks running on the same node, each task must choose a single one of the allocated adapter resource units to use as its primary port to send FIFO (first in, first out) data. This design choice has proven to present a problem with balancing loads on the adapters/ports.
Sub-optimal choices from individual tasks running on the same node can result in a heavy load on some adapters/ports and less load on others, since some relatively large number of tasks on the same node might select an adapter resource unit that happens to be on one particular adapter resulting in a heavy load on that one particular adapter and inefficient utilization of other adapters. This compromises the goal of achieving good aggregate performance.